package br.com.site.model.entity;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;

import br.com.site.model.dao.DAOException;
import br.com.site.model.dao.DAOFactory;
import br.com.site.model.dao.UsuarioDAO;
import br.com.site.validation.Annotation.Validar;

@Entity
public class Usuario extends Pessoa implements CrudBaseEntity<Usuario, String> {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	public static final long PERFIL_ADMINISTRADOR = 1;
	public static final long PERFIL_COLABORADOR = 3;
	public static final long PERFIL_COORDENADOR = 2;
	public static final long PERFIL_VISITANTE = 4;
	
	
	@Validar()
	@Id
	private String login;

	@Validar()
	@Column(nullable = false)
	private String senha;

	@Validar()
	@Column(nullable = false, length = 1)
	private Long perfil;

	private Date lastLogin;

	@ManyToMany(mappedBy = "colaboradores")
	private List<Estande> estandesQSouColaborador = new ArrayList<Estande>();

	@OneToMany(mappedBy = "coordenador")
	private List<Estande> estandesQSouCoordenador = new ArrayList<Estande>();

	@OneToMany(mappedBy = "donoPergunta", cascade = CascadeType.REMOVE, fetch = FetchType.LAZY)
	private List<Pergunta> perguntas;

	@OneToMany(mappedBy = "donoResposta", cascade = CascadeType.REMOVE, fetch = FetchType.LAZY)
	private List<Resposta> respostas;

	@OneToMany
	private List<Discurssao> discurssoes;

	@OneToMany
	private List<Mensagem> menssagens;
	
	@OneToOne(cascade={CascadeType.ALL}, fetch=FetchType.EAGER)
	private FotoUsuario foto;

	public String getLogin() {
		return login;
	}

	public String getSenha() {
		return senha;
	}

	public void setLogin(String login) {
		this.login = login;
	}

	public void setSenha(String senha) {
		this.senha = senha;
	}

	public Long getPerfil() {
		return perfil;
	}

	public void setPerfil(Long perfil) {
		this.perfil = perfil;
	}

	public Date getLastLogin() {
		return lastLogin;
	}

	public void setLastLogin(Date lastLogin) {
		this.lastLogin = lastLogin;
	}

	public String getDescricaoPerfil(Long x) {
		if (x.equals(PERFIL_ADMINISTRADOR)) {
			return "Administrador";
		} else {
			if (x.equals(PERFIL_COLABORADOR)) {
				return "Colaborador";
			} else if (x.equals(PERFIL_COORDENADOR)) {
				return "Coordenador";
			} else {
				return "Perfil não existe.";
			}
		}
	}

	public boolean isColaborador() {
		return perfil.equals(PERFIL_COLABORADOR);
	}

	public boolean isAdministrador() {
		return perfil.equals(PERFIL_ADMINISTRADOR);
	}

	public boolean isCoordenador() {
		return perfil.equals(PERFIL_COORDENADOR);
	}

	public boolean isVisitante() {
		return perfil.equals(PERFIL_VISITANTE);
	}

	public List<Estande> getEstandesQSouColaborador() {
		return estandesQSouColaborador;
	}

	public void setEstandesQSouColaborador(List<Estande> estandesQSouColaborador) {
		this.estandesQSouColaborador = estandesQSouColaborador;
	}

	public List<Estande> getEstandesQSouCoordenador() {
		return estandesQSouCoordenador;
	}

	public void setEstandesQSouCoordenador(List<Estande> estandesQSouCoordenador) {
		this.estandesQSouCoordenador = estandesQSouCoordenador;
	}

	public List<Pergunta> getPerguntas() {
		return perguntas;
	}

	public void setPerguntas(List<Pergunta> perguntas) {
		this.perguntas = perguntas;
	}

	public List<Resposta> getRespostas() {
		return respostas;
	}

	public void setRespostas(List<Resposta> respostas) {
		this.respostas = respostas;
	}

	public List<Discurssao> getDiscurssoes() {
		return discurssoes;
	}

	public void setDiscurssoes(List<Discurssao> discurssoes) {
		this.discurssoes = discurssoes;
	}

	public List<Mensagem> getMenssagens() {
		return menssagens;
	}

	public void setMenssagens(List<Mensagem> menssagens) {
		this.menssagens = menssagens;
	}
	

	public FotoUsuario getFoto() {
		return foto;
	}

	public void setFoto(FotoUsuario foto) {
		this.foto = foto;
	}

	@Override
	public boolean equals(Object obj) {
		// TODO Auto-generated method stub
		if (obj instanceof Usuario) {
			Usuario usuario = (Usuario) obj;
			if (usuario.login.equals(this.login))
				return true;
		}
		return false;

		// return super.equals(obj);
	}

	@Override
	public String toString() {
		// TODO Auto-generated method stub
		// return super.toString();
		return this.login;
	}

	@Override
	public String getId() {
		// TODO Auto-generated method stub
		return login;
	}

	@Override
	public void remove() throws BusinessException {
		DAOFactory factory = DAOFactory.getInstance();
		try {
			factory.txBegin();
			UsuarioDAO dao = factory.getDao(UsuarioDAO.class);
			dao.remove(this.login);

			factory.txCommit();
		} catch (DAOException e) {
			factory.txRollback();
			throw new BusinessException(e);
		} finally {
			factory.shutdown();
		}

	}

	@Override
	public void save() throws BusinessException {

		DAOFactory factory = DAOFactory.getInstance();
		try {
			factory.txBegin();
			UsuarioDAO dao = factory.getDao(UsuarioDAO.class);
			dao.save(this);

			factory.txCommit();
		} catch (DAOException e) {
			factory.txRollback();
			throw new BusinessException(e);
		} finally {
			factory.shutdown();
		}
	}

	public static Usuario find(String oid) {
		DAOFactory factory = DAOFactory.getInstance();
		UsuarioDAO dao = factory.getDao(UsuarioDAO.class);

		return dao.find(oid);
	}

	public static List<Usuario> find() {
		DAOFactory factory = DAOFactory.getInstance();
		UsuarioDAO dao = factory.getDao(UsuarioDAO.class);

		return dao.find();
	}

	public static List<Usuario> findByCriteria(Usuario user) {
		DAOFactory factory = DAOFactory.getInstance();
		UsuarioDAO dao = factory.getDao(UsuarioDAO.class);

		return dao.findByCriteria(user);
	}

	public static List<Usuario> find(int first, int max) {
		DAOFactory factory = DAOFactory.getInstance();
		UsuarioDAO dao = factory.getDao(UsuarioDAO.class);

		return dao.find(first, max);
	}

	public static List<Usuario> findByCriteria(Usuario usuario, int first,
			int max) {
		DAOFactory factory = DAOFactory.getInstance();
		UsuarioDAO dao = factory.getDao(UsuarioDAO.class);

		return dao.findByCriteria(usuario, first, max);

	}

	public static String decodePerfil(Long parametro_perfil) {

		if (parametro_perfil.equals(PERFIL_ADMINISTRADOR))
			return "Administrador";
		if (parametro_perfil.equals(PERFIL_COLABORADOR))
			return "Colaborador";
		if (parametro_perfil.equals(PERFIL_COORDENADOR))
			return "Coordenador";

		return "Visitante";
	}

	public String getDescricaoPerfil() {
		return decodePerfil(perfil);
	}

}
